#include "dma.h"

u8 dma1_ch2_send_buf[LEN_DMA_SEND_BUF] = {0}; // DMA1_CH2存放发送数据的内存地址

u8 dma1_ch7_send_buf[LEN_DMA_SEND_BUF] = {0}; // DMA1_CH7存放发送数据的内存地址

/*
 *函数名称:USART3_Tx_DMA1_CH2_Init
 *函数功能:初始化USART3发送端的DMA1通道2
 *参数:无
 *返回值:无
 *备  注:无
 */
void USART3_Tx_DMA1_CH2_Init(void)
{
    DMA_InitTypeDef DMA_InitStructure;

    RCC_AHBPeriphClockCmd(USART3_RCC_CLK, ENABLE); // 使能DMA传输

    DMA_DeInit(USART3_DMA_Channel); // 将DMA1的通道2寄存器设为缺省值

    // 配置DMA参数
    DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART3->DR;            // USART3的数据寄存器地址
    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)dma1_ch2_send_buf;          // 存放发送数据的内存地址
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;                      // 设置DMA传输方向为从内存到外设
    DMA_InitStructure.DMA_BufferSize = 0;                                   // 设置缓冲区大小，初始化为0，需要根据实际情况更改
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;        // 禁止外设地址自增
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                 // 允许内存地址自增
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; // 外设数据大小为字节
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;         // 内存数据大小为字节
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;                           // 设置DMA传输模式为普通模式
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;                     // 设置DMA传输优先级为高
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                            // 禁止存储器到存储器的传输
    DMA_Init(USART3_DMA_Channel, &DMA_InitStructure);                       // 初始化DMA1通道2

    DMA_Cmd(USART3_DMA_Channel, DISABLE); // 禁止DMA传输通道2
    DMA_ClearFlag(USART3_FLAG);           // 清除DMA1的通道2全局标志位
}

/*
 *函数名称:USART2_Tx_DMA1_CH7_Init
 *函数功能:初始化USART2发送端的DMA1通道7
 *参数:无
 *返回值:无
 *备  注:无
 */
void USART2_Tx_DMA1_CH7_Init(void)
{
    DMA_InitTypeDef DMA_InitStructure;

    RCC_AHBPeriphClockCmd(USART2_RCC_CLK, ENABLE); // 使能DMA传输

    DMA_DeInit(USART2_DMA_Channel); // 将DMA1的通道7寄存器设为缺省值

    // 配置DMA参数
    DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART2->DR;            // USART2的数据寄存器地址
    DMA_InitStructure.DMA_MemoryBaseAddr = (u32)dma1_ch7_send_buf;          // 存放发送数据的内存地址
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;                      // 设置DMA传输方向为从内存到外设
    DMA_InitStructure.DMA_BufferSize = 0;                                   // 设置缓冲区大小，初始化为0，需要根据实际情况更改
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;        // 禁止外设地址自增
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                 // 允许内存地址自增
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; // 外设数据大小为字节
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;         // 内存数据大小为字节
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;                           // 设置DMA传输模式为普通模式
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;                     // 设置DMA传输优先级为高
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                            // 禁止存储器到存储器的传输

    DMA_Init(USART2_DMA_Channel, &DMA_InitStructure); // 初始化DMA2通道7

    DMA_Cmd(USART2_DMA_Channel, DISABLE); // 禁止DMA传输通道7
    DMA_ClearFlag(DMA1_FLAG_GL7);         // 清除DMA1的通道7全局标志位
}
